import pandas as pd
import re

# 1. 读取文件（指定路径）
file_path = r'C:\Users\admin\Desktop\student.xlsx'
try:
    df = pd.read_excel(file_path, engine='openpyxl')
    print("=" * 50)
    print("1. 原始学生信息：")
    print(df)
except FileNotFoundError:
    print(f"❌ 错误：未找到文件：{file_path}")
    exit()
except Exception as e:
    print(f"❌ 读取文件失败：{str(e)}")
    exit()

# 检查必要列（需要“姓名、性别、年龄、家庭地址”，这里假设地址列名为“家庭地址”，可根据实际列名修改）
required_columns = ['姓名', '性别', '年龄', '家庭地址']
missing_cols = [col for col in required_columns if col not in df.columns]
if missing_cols:
    print(f"❌ 错误：Excel 中缺少必要列：{missing_cols}")
    exit()

# 2. 从“年龄”生成“年龄段”
def get_age_group(age):
    """将年龄转换为年龄段（每5岁一组）"""
    try:
        age = int(age)  # 确保年龄是整数
        if age < 18:
            return "18岁以下"
        elif 18 <= age <= 22:
            return "18-22岁"
        elif 23 <= age <= 27:
            return "23-27岁"
        elif 28 <= age <= 32:
            return "28-32岁"
        else:
            return "33岁以上"
    except:
        return "年龄格式错误"

df['年龄段'] = df['年龄'].apply(get_age_group)  # 新增“年龄段”列
print("\n" + "=" * 50)
print("2. 生成年龄段后的信息：")
print(df[['姓名', '年龄', '年龄段']])  # 展示年龄和对应的年龄段

# 3. 从“家庭地址”中提取省份
def extract_province(address):
    """从地址中提取省份，匹配以“XX省”“XX自治区”“XX直辖市”开头的部分"""
    address = str(address).strip()  # 转换为字符串并去除空格
    # 匹配省份、自治区、直辖市，如“海南省”“广西壮族自治区”“北京市”等
    province_pattern = re.compile(r'^(.*?[省市自治区直辖市])')
    province_match = province_pattern.search(address)
    if province_match:
        province = province_match.group(1).strip()
        # 去除可能多余的“省”“市”等后缀，只保留到“XX省”“XX自治区”等
        province = re.sub(r'[省市自治区直辖市]$', '', province) + \
                  re.search(r'[省市自治区直辖市]$', province).group() if re.search(r'[省市自治区直辖市]$', province) else province
        return province
    return "省份提取失败"

df['省份'] = df['家庭地址'].apply(extract_province)  # 新增“省份”列
print("\n" + "=" * 50)
print("3. 从地址中提取的省份：")
print(df[['姓名', '家庭地址', '省份']])  # 展示地址和提取的省份

# 4. 按性别统计
print("\n" + "=" * 50)
print("4. 按性别统计人数：")
gender_count = df['性别'].value_counts().sort_index()
print(gender_count)

# 5. 按年龄段统计
print("\n" + "=" * 50)
print("5. 按年龄段统计人数：")
age_group_order = ["18岁以下", "18-22岁", "23-27岁", "28-32岁", "33岁以上", "年龄格式错误"]
age_count = df['年龄段'].value_counts().reindex(age_group_order, fill_value=0)
print(age_count)

# 6. 按省份统计
print("\n" + "=" * 50)
print("6. 按省份统计人数：")
province_count = df['省份'].value_counts().sort_index()
print(province_count)

print("\n" + "=" * 50)
print("✅ 统计完成！")